/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ssp.event;

import java.util.ArrayList;
import java.util.List;
import ssp.agent.QualityDemand;
import ssp.net.NWcomponent;
import ssp.service.FrontendServer;

/**
 * サービスからの客の離脱イベントを表すクラス
 * @author yamazaki
 */
public class DepartureEvent extends Event {
    
    //対象のフロントエンドサーバ
    FrontendServer frontendServer;
    
    //対象のネットワークコンポーネント
    List<NWcomponent> path;
    
    //サービス要求
    QualityDemand qos;

    /**
     * コンストラクタ
     * @param evevtTime イベント時間
     * @param frontendServer 対象のフロントエンドサーバ
     * @param path 対象のネットワークコンポーネント
     * @param qos ユーザの要求
     */
    public DepartureEvent(double evevtTime, FrontendServer frontendServer, List<NWcomponent> path, QualityDemand qos) {
        super(evevtTime);
        this.frontendServer = frontendServer;
        this.path = new ArrayList<>(path);
        this.qos = qos;
    }

    @Override
    public void fire() {
        
        //フロントエンドサーバからの離脱
        frontendServer.departure(frontendServer.getServiceEntry(qos.getTypeID()));
        
        //各ネットワークコンポーネントからの離脱
        NWcomponent prevNode = null;
        NWcomponent currentNode = null;
        NWcomponent nextNode = null;
        for(NWcomponent node : path) {
            if(prevNode == null) {
                prevNode = node;
            } else if(currentNode == null) {
                currentNode = node;
                prevNode.getNWresourceManager().releaseResources(node, prevNode.getEndsOfInternalPath(node), qos.getBandwidth());
            } else {
                nextNode = node;
                currentNode.getNWresourceManager().releaseResources(prevNode, nextNode, qos.getBandwidth());
                prevNode = currentNode;
                currentNode = nextNode;
            }
        }
    }
    
}
